Cargar las librerías a utilizar
library(shiny)
library(plotly)
library(dplyr)
library(tidyverse)
library(polycor)
library(lubridate)
library(tidyr)
## Framework for Financial Data Extracting and modeling
library(quantmod)
Lectura y creación de los DataFrames mediante conexion a Yahoo Finance, para este punto se cargarn los datos de la TRM y el valor del petroleto WTI
TRM <- getSymbols("USDCOP=X",auto.assign=FALSE, from="2008-01-01", src='yahoo')
WTI <- getSymbols("WTI",auto.assign=FALSE, from="2008-01-01", src='yahoo')
## Estandarizar nombres de columnas
names(TRM)<-c('Open','High','Low','Close','Volume','Adjusted')
names(WTI)<-c('Open','High','Low','Close','Volume','Adjusted')
## Transformar bases de datos a Data Frames
TRM <- data.frame(Date=index(TRM), coredata(TRM))
WTI <- data.frame(Date=index(WTI), coredata(WTI))
Revisión de posibles valores NA
colSums(is.na(TRM))
## Date Open High Low Close Volume Adjusted
## 0 17 17 17 17 17 17
colSums(is.na(WTI))
## Date Open High Low Close Volume Adjusted
## 0 0 0 0 0 0 0
filter(TRM, is.na(Open))
## Date Open High Low Close Volume Adjusted
## 1 2010-01-01 NA NA NA NA NA NA
## 2 2013-09-09 NA NA NA NA NA NA
## 3 2013-09-10 NA NA NA NA NA NA
## 4 2013-09-11 NA NA NA NA NA NA
## 5 2013-09-12 NA NA NA NA NA NA
## 6 2013-09-13 NA NA NA NA NA NA
## 7 2013-09-16 NA NA NA NA NA NA
## 8 2013-09-17 NA NA NA NA NA NA
## 9 2013-09-18 NA NA NA NA NA NA
## 10 2013-09-19 NA NA NA NA NA NA
## 11 2013-09-20 NA NA NA NA NA NA
## 12 2014-08-25 NA NA NA NA NA NA
## 13 2014-08-26 NA NA NA NA NA NA
## 14 2014-08-27 NA NA NA NA NA NA
## 15 2014-08-28 NA NA NA NA NA NA
## 16 2014-08-29 NA NA NA NA NA NA
## 17 2019-05-22 NA NA NA NA NA NA
Vemos que los datos del WTI estan completos, mientras que los de la TRM contienen algunos NA, al revisar en la web, estas fechas si tienen datos por lo cual se trata de un error en la BD, para efectos practicos de este ejercicio los reemplazaremos con el valor anterior, sin embargo, en el futuro seria necesario buscar una fuente adicional para cubrirlos y contar un base más precisa
TRM<-TRM %>% fill(Open, High, Low, Close,Volume, Adjusted)
Inspeccion de los data frames
str(TRM)
## 'data.frame': 3340 obs. of 7 variables:
## $ Date : Date, format: "2008-01-01" "2008-01-02" ...
## $ Open : num 1999 2009 1980 1987 1976 ...
## $ High : num 1999 2009 1987 2012 2010 ...
## $ Low : num 1999 1979 1980 1972 1976 ...
## $ Close : num 1999 1979 1987 1972 1976 ...
## $ Volume : num 0 0 0 0 0 0 0 0 0 0 ...
## $ Adjusted: num 1999 1979 1987 1972 1976 ...
str(WTI)
## 'data.frame': 3222 obs. of 7 variables:
## $ Date : Date, format: "2008-01-02" "2008-01-03" ...
## $ Open : num 30.2 31.4 31.3 31.2 31.4 ...
## $ High : num 31.3 31.9 31.4 31.5 32.1 ...
## $ Low : num 30.2 30.9 30.7 30.9 31.4 ...
## $ Close : num 31.2 31.2 30.9 31.4 31.4 ...
## $ Volume : num 298400 349800 303700 939900 522900 ...
## $ Adjusted: num 24.1 24.1 23.9 24.3 24.3 ...
Vemos que hay menos filas en WTI que en TRM, asi que revisaremos los valores faltantes en ambas
miss <- filter(TRM, !Date %in% WTI$Date)
tail(miss,20)
## Date Open High Low Close Volume Adjusted
## 99 2018-11-22 3194.20 3194.20 3147.20 3190.00 0 3190.00
## 100 2018-12-05 3160.40 3174.20 3132.80 3172.00 0 3172.00
## 101 2018-12-25 3245.80 3293.50 3245.80 3285.00 0 3285.00
## 102 2019-01-01 3196.00 3245.00 3196.00 3246.00 0 3246.00
## 103 2019-01-21 3096.40 3128.80 3081.60 3121.00 0 3121.00
## 104 2019-02-18 3098.40 3129.70 3090.00 3131.00 0 3131.00
## 105 2019-04-19 3118.80 3156.00 3118.80 3153.00 0 3153.00
## 106 2019-05-27 3327.30 3357.40 3314.50 3327.30 0 3327.30
## 107 2019-07-04 3169.20 3194.10 3152.60 3208.80 0 3208.80
## 108 2019-09-02 3409.40 3448.40 3395.90 3439.00 0 3439.00
## 109 2019-11-28 3503.75 3519.32 3460.33 3503.75 0 3503.75
## 110 2019-12-25 3296.25 3298.23 3296.25 3296.25 0 3296.25
## 111 2020-01-01 3279.76 3279.76 3279.76 3279.76 0 3279.76
## 112 2020-01-20 3330.76 3330.76 3285.62 3330.76 0 3330.76
## 113 2020-02-17 3389.25 3394.89 3388.88 3388.00 0 3388.00
## 114 2020-04-10 3828.69 3828.69 3825.25 3827.00 0 3827.00
## 115 2020-05-25 3773.28 3776.71 3729.85 3773.28 0 3773.28
## 116 2020-07-03 3644.24 3648.46 3601.47 3644.24 0 3644.24
## 117 2020-09-07 3713.26 3713.26 3672.77 3713.26 0 3713.26
## 118 2020-10-19 3846.35 3847.49 3805.54 3846.35 0 3846.35
Vemos que en la base de WTI no hay valores para los festivos en Estados Unidos, mientras que en la de TRM si, por lo cual para efectos del analisis eliminaremos estos Datos para contar con bases comparables, espeicalmente de cara al analisis de correlacion
TRM<- filter(TRM, !Date %in% miss$Date)
Ahora, hacemos la misma revision para revision de manera opuesta
miss<- filter(WTI, !Date %in% TRM$Date)
tail(miss,20)
## [1] Date Open High Low Close Volume Adjusted
## <0 rows> (or 0-length row.names)
Por otro lado, vemos que en TRM estan todos los dias que estan en WTI, por lo cual podemos continuar sin realizar màs ajustes.
Ahora, ponemos columnas con el mes y el año para facilitar la elaboración de los graficos.
TRM$Month<- format(as.Date(TRM$Date), "%Y-%m")
TRM$Year<- format(as.Date(TRM$Date), "%Y")
WTI$Month<- format(as.Date(WTI$Date), "%Y-%m")
WTI$Year<- format(as.Date(WTI$Date), "%Y")
Grafico de la TRM y corrección de datos
fig <- plot_ly(TRM, x = ~Date, y = ~Close, type = 'scatter', mode = 'lines')
fig
errors<-filter(TRM, Low <1000)
errors
## Date Open High Low Close Volume Adjusted Month
## 1 2013-07-12 1910.75 1910.75 3.6728 3.6728 0 3.6728 2013-07
## 2 2014-02-18 2.33 2028.00 2.3300 2028.0000 0 2028.0000 2014-02
## 3 2014-04-09 1932.00 1932.00 19.3100 1927.0000 0 1927.0000 2014-04
## 4 2014-07-21 1866.00 1866.00 185.0000 1856.0000 0 1856.0000 2014-07
## 5 2014-09-10 1890.60 1978.25 174.0000 1935.3000 0 1935.3000 2014-09
## 6 2014-09-22 1932.90 1996.00 196.0000 1932.1000 0 1932.1000 2014-09
## 7 2014-10-16 1981.10 2051.50 20.6900 2019.7000 0 2019.7000 2014-10
## 8 2014-11-28 2127.90 2127.90 22.0000 2126.5000 0 2126.5000 2014-11
## 9 2014-12-16 2361.40 2451.30 24.2500 24.2500 0 24.2500 2014-12
## 10 2015-01-30 2316.70 2378.10 24.3400 2378.1001 0 2378.1001 2015-01
## 11 2015-02-03 2392.10 2392.10 12.0000 2357.0000 0 2357.0000 2015-02
## 12 2015-02-17 2358.60 2358.60 24.1500 24.1500 0 24.1500 2015-02
## 13 2015-02-20 2393.60 2398.60 24.5000 24.5000 0 24.5000 2015-02
## 14 2015-03-06 2502.10 2575.00 25.0000 2575.0000 0 2575.0000 2015-03
## 15 2015-03-25 2503.00 2543.00 250.0000 250.0000 0 250.0000 2015-03
## 16 2015-04-10 2467.50 2516.00 25.0000 2515.0000 0 2515.0000 2015-04
## 17 2015-04-14 2449.70 2556.00 25.5900 2554.0000 0 2554.0000 2015-04
## 18 2015-06-01 2491.20 2542.00 25.4300 2542.0000 0 2542.0000 2015-06
## 19 2015-06-05 2565.50 2627.00 26.2200 26.2200 0 26.2200 2015-06
## 20 2015-08-03 2833.30 2917.00 281.0000 2917.0000 0 2917.0000 2015-08
## 21 2015-10-08 2873.50 2873.50 288.0000 2868.0000 0 2868.0000 2015-10
## 22 2015-10-26 2873.60 2927.00 29.2900 2927.0000 0 2927.0000 2015-10
## 23 2015-12-10 3234.70 3260.00 324.0000 324.0000 0 324.0000 2015-12
## 24 2015-12-15 3269.20 3320.00 33.1400 33.1400 0 33.1400 2015-12
## 25 2016-02-18 3375.90 3375.90 33.4000 33.4000 0 33.4000 2016-02
## 26 2016-04-15 2947.90 2997.00 2.0000 2997.0000 0 2997.0000 2016-04
## 27 2019-05-15 3267.70 3291.80 32.0000 3284.6001 0 3284.6001 2019-05
## 28 2019-10-22 3384.94 3404.96 343.0000 3447.0000 0 3447.0000 2019-10
## Year
## 1 2013
## 2 2014
## 3 2014
## 4 2014
## 5 2014
## 6 2014
## 7 2014
## 8 2014
## 9 2014
## 10 2015
## 11 2015
## 12 2015
## 13 2015
## 14 2015
## 15 2015
## 16 2015
## 17 2015
## 18 2015
## 19 2015
## 20 2015
## 21 2015
## 22 2015
## 23 2015
## 24 2015
## 25 2016
## 26 2016
## 27 2019
## 28 2019
Como podemos ver en la grafica hay algunos datos atipicos y despues de consultar otras fuentes de datos se puede concluir que son datos erroneos en la BD de Yahoo, por lo cual será necesario ajustarlos. Asi mismo, Vemos que el error es solo en las columnas Low, Close y Adjusted, dado que son pocos datos no nos alterara mucho el analisis y los podemos ajustar a partir de los datos que estan correctos. Asi que teemplazaremos los valores errones con el precio de apertura el dia.
TRM <- TRM %>% mutate(Close= ifelse(Close < 1000, Open, Close)) %>%
mutate(Low= ifelse(Low < 1000, Close, Low)) %>%
mutate(Adjusted= ifelse(Adjusted < 1000, Open, Adjusted))
Creación de funcion para graficar
graficar<-function(data,periodo,tipo){
fig <- plot_ly(data, x = ~Date, y = ~Close, type = 'scatter', mode = 'lines',name = 'Close')
fig <-fig %>% add_trace(y = ~Low, name = 'Low', line = list(color = I('red'), width = 1))
fig <-fig %>% add_trace(y = ~High, name = 'High', line = list(color = I('green'), width = 1))
fig <- fig %>% layout(title = paste("Serie ", tipo, periodo),
xaxis = list(title = "Fecha"),
yaxis = list (title = "Valor"))
fig
}
graficar(TRM,'Diaria','TRM')
Para las gráficas mensuales y anuales se calcularon los valores de la siguiente manera: - El valor de Cierre es el ultimo valor de Cierre Registrado en el periodio. - El valor Minimo es el menor valor durante todo el periodo. - El valor Máximo es el mayor valor durante todo el periodo.
Observacion: no trabajamos con el promedio aritmetico, sino con el ultimo valor del cierre del mes, dado que el promedio es un buen estimador del comportamiento de variables con ciertas distribuciones como la normal, pero al no conocer aún la dsitribucion de probabilidad de esta variable es mejor no utilizarlo.
temp<-group_by(TRM,Month)
temp<-summarize(temp, last(Close),max(Close), min(Close))
names(temp)<-c('Date','Close','High','Low')
graficar(temp,'Semanal','TRM')
temp<-group_by(TRM,Year)
temp<-summarize(temp, last(Close),max(Close), min(Close))
names(temp)<-c('Date','Close','High','Low')
graficar(temp,'Mensual','TRM')
graficar(WTI,'Diaria','WTI')
temp<-group_by(WTI,Month)
temp<-summarize(temp, last(Close),max(Close), min(Close))
names(temp)<-c('Date','Close','High','Low')
graficar(temp,'Mensual','WTI')
temp<-group_by(WTI,Year)
temp<-summarize(temp, last(Close),max(Close), min(Close))
names(temp)<-c('Date','Close','High','Low')
graficar(temp,'Mensual','WTI')
fig <- plot_ly(TRM, y = ~Close, color = ~Month, type = "box",boxpoints = FALSE)
fig <- fig %>% layout(title = "BoxPlot por meses TRM (precio Cierre)",
xaxis = list(title = "Fecha"),
yaxis = list (title = "Valor $"),showlegend = FALSE)
fig
fig <- plot_ly(WTI, y = ~Close, color = ~Month, type = "box",boxpoints = FALSE)
fig <- fig %>% layout(title = "BoxPlot por meses WTI(precio Cierre)",
xaxis = list(title = "Fecha"),
yaxis = list (title = "Valor USD"),showlegend = FALSE)
fig
Para el analisis de correlacion uniremos ambos DataSets
DataSet<- merge(TRM,WTI,by.x='Date',by.y='Date',all=TRUE)
DataSet<-select(DataSet, Date, Close.x, Close.y,Year.x)
names(DataSet)<-c('Date','TRM','WTI','Year')
Elaboraremos primero un scatter plot para ver graficamente la relacion entre las variables y el comportamiento con el paso de los años
p <- ggplot(DataSet, aes( WTI, TRM ) ) +
geom_point(aes( colour = Year )) +
geom_smooth(method = 'loess' )
fig <- ggplotly(p)
fig <- fig %>% layout(title = "TRM vs WTI",showlegend = FALSE)
fig
Al observar la grafica anterior podemos notar que las dos variables estan estrechamente. Sin embargo, esta relacion no es lineal, sino posiblemente exponencial. Para analizar de una manera exploratoria inicial la relacion entre estas dos variables, a pesar de su relacion aparentemente exponencial, transformaremos el WTI en su logaritmo para asi lograr aproximar la relacion a lineal.
DataSet$LogWTI<-log(DataSet$WTI)
p <- ggplot(DataSet, aes( LogWTI, TRM ) ) +
geom_point(aes( colour = Year )) +
geom_smooth(aes( group = 1 ))
fig <- ggplotly(p)
fig <- fig %>% layout(title = "TRM vs WTI",showlegend = FALSE)
fig
cor(DataSet$TRM,DataSet$WTI,use = 'complete.obs')
## [1] -0.7093624
cor(DataSet$TRM,DataSet$LogWTI,use = 'complete.obs')
## [1] -0.8596149
A partir del resultado anterior podemos concluir que las dos variables estan relacionadas fuertemente de manera inversa y aproximadamente exponencial, ya que obtuvimos un coeficiente de correlacion de -0.85 al trabajar con el log del WTI.
ResumenTRM<-group_by(TRM,Year)
ResumenTRM<-summarize(ResumenTRM, mean(Close),max(Close), min(Close))
names(ResumenTRM)<-c('Año','Promedio','Maximo','Minimo')
knitr::kable(ResumenTRM, format.args = list(scientific = FALSE))
| Año | Promedio | Maximo | Minimo |
|---|---|---|---|
| 2008 | 1938.913 | 2362.80 | 1625.70 |
| 2009 | 2136.865 | 2598.00 | 1810.00 |
| 2010 | 1888.405 | 2023.00 | 1755.60 |
| 2011 | 1838.203 | 1969.30 | 1726.90 |
| 2012 | 1789.363 | 1908.00 | 1715.50 |
| 2013 | 1870.116 | 1949.00 | 1758.00 |
| 2014 | 1990.015 | 2427.00 | 1557.00 |
| 2015 | 2734.427 | 3327.00 | 2323.00 |
| 2016 | 3024.786 | 3414.00 | 2806.00 |
| 2017 | 2938.570 | 3094.25 | 2796.70 |
| 2018 | 2948.148 | 3293.50 | 2681.40 |
| 2019 | 3274.419 | 3510.86 | 3038.90 |
| 2020 | 3712.618 | 4174.75 | 3204.05 |
A pesar de que se observa una fuerte correlacion entre el valor de la TRM y el valor del petroleto, tambien se puede concluir que el precio del petroleo no es suficiente para explicar completamente el valor de la TRM, ya que vemos valores muy diferentes para la TRM entre los años 2020 vs 2016 y 2019 vs 2015 a pesar que entre estos pares de años el valor del petroleo se comportó de manera simular. Eso implicaria que, aunque el precio del petroleo impacta fuertemente el valor de la TRM, hay otras variables que también están afectando su valor y que deben ser incluidas y analizadas en un modelo que pretenda estimar el valor de la TRM en el futuro. Por ejemplo se podría buscar aislar la influencia del precio del petroleo de la tendencia natural de la TRM a subir(ya que se observa a lo largo de casi toda la serie) o incluir variables relacionados con la balanza comercial, crecimiento del PIB, comportamiento de las bolsas de USA, etc.
Al analizar las series de la TRM y del WTI, podemos observar que el tema del coronavirus impactó ambas variables, en la TRM causando un gran crecimiento en marzo y en el precio del petroleo una caida enttre enero y marzo. Pero a apartir de Julio, la TRM parece haber recuperado su tendencia normal aunque en un nivel mas alto, lo que podría ser la nueva normalidad para esta variable en un entorno de pandemia.
Lectura de los datos
Empresas<-read.csv('BASE.txt',sep = ';')
Monedas <-read.csv('Monedas.txt',sep = ';')
Revision de la estructura de la informacion
str(Empresas)
## 'data.frame': 3383 obs. of 4 variables:
## $ Fecha : Factor w/ 365 levels "01/01/2017","01/02/2017",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ Empresa: Factor w/ 4 levels "Empesa B","Empresa A",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ Moneda : Factor w/ 3 levels "EURO","PESO",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ Ingreso: num 0.000137 0.001744 0.126475 0.000118 0 ...
str(Monedas)
## 'data.frame': 365 obs. of 3 variables:
## $ FECHA: Factor w/ 365 levels "01/01/2017","01/02/2017",..: 1 13 25 37 49 61 73 85 97 109 ...
## $ USD : num 3001 3001 2981 2965 2941 ...
## $ EURO : num 3137 3140 3096 3095 3088 ...
Inicialmente, vemos que la fecha quedo como un factor, por lo cual la converteriemos a formato fecha para facilitar su manipulacion
Empresas$Fecha<-dmy(Empresas$Fecha)
Monedas$Fecha<-dmy(Monedas$FECHA)
Monedas$FECHA<-NULL
Ahora revisaremos el estado de los datos numericos
tapply(Empresas$Empresa, Empresas$Moneda, summary)
## $EURO
## Empesa B Empresa A Empresa C EmpresaC
## 365 365 365 0
##
## $PESO
## Empesa B Empresa A Empresa C EmpresaC
## 365 365 365 98
##
## $USD
## Empesa B Empresa A Empresa C EmpresaC
## 365 365 365 0
Vemos que tenemos algunos registros de una empresa llamada “EmpresaC” en la Base datos, y dado que la base datos solo debe contener informacion de 3 empresas, y que los registros de las otras 3 empresas estan completos(365 dias), asumiremos que estos datos de la “EmpresaC” se deben a un error en la generacion de la informacion y los eliminaremos.
Empresas<-filter(Empresas,Empresa != 'EmpresaC')
temp<-group_by(Empresas,Empresa,Moneda)
summarize(temp, mean(Ingreso),max(Ingreso),min(Ingreso))
## # A tibble: 9 x 5
## # Groups: Empresa [3]
## Empresa Moneda `mean(Ingreso)` `max(Ingreso)` `min(Ingreso)`
## <fct> <fct> <dbl> <dbl> <dbl>
## 1 Empesa B EURO 0.00291 0.285 -0.252
## 2 Empesa B PESO 897. 5199. -16183.
## 3 Empesa B USD 0.0431 1.81 -1.89
## 4 Empresa A EURO 0.00158 0.126 -0.108
## 5 Empresa A PESO 196. 1893. -5784.
## 6 Empresa A USD 0.0270 1.42 -1.38
## 7 Empresa C EURO 0.000956 0.0819 -0.0666
## 8 Empresa C PESO 385. 2302. -10708.
## 9 Empresa C USD 0.0170 0.654 -0.665
Los valores numericos aparentemente se ven correctamente leidos y sin datos atipicos
Ahora realizaremos un Join para contar con toda la información necesaria en el mismo DataFrame
df <-merge(x = Empresas, y = Monedas, by = "Fecha", all.x = TRUE)
df <- df %>% mutate(IngresoPesos= case_when(Moneda == 'USD' ~ Ingreso*USD,
Moneda == 'EURO' ~ Ingreso*EURO,
Moneda == 'PESO' ~ Ingreso))
## Revisar que no hayan quedado NAs
colSums(is.na(df))
## Fecha Empresa Moneda Ingreso USD
## 0 0 0 0 0
## EURO IngresoPesos
## 0 0
En este numeral entiendo que se desean analizar unicamente las inversiones en USD
temp<-filter(df,Moneda == 'USD')
temp<-group_by(temp,Empresa)
temp<-data.frame(summarise(temp, IngresosUD =sum(Ingreso)))
knitr::kable(temp, format.args = list(scientific = FALSE))
| Empresa | IngresosUD |
|---|---|
| Empesa B | 15.723750 |
| Empresa A | 9.864023 |
| Empresa C | 6.221502 |
temp<-filter(df,Empresa == 'Empresa A')
temp<-group_by(temp,Moneda)
temp<-data.frame(summarise(temp, IngresosUD =sum(Ingreso)))
knitr::kable(temp, format.args = list(scientific = FALSE))
| Moneda | IngresosUD |
|---|---|
| EURO | 0.5750223 |
| PESO | 71668.0695237 |
| USD | 9.8640228 |
temp<-filter(df,Fecha <=dmy('30/06/2017'))
temp<-group_by(temp,Empresa)
temp<- data.frame(summarise(temp, Ingresos =sum(IngresoPesos)))
temp<-temp[order(temp$Ingresos),]
temp<-temp[1,]
knitr::kable(temp, format.args = list(scientific = FALSE))
| Empresa | Ingresos | |
|---|---|---|
| 2 | Empresa A | 55525.66 |
temp<-df
temp$Trimestre<-quarter(temp$Fecha)
temp<-group_by(temp,Empresa,Trimestre)
temp<- data.frame(summarise(temp, Ingresos =sum(IngresoPesos)))
knitr::kable(temp, format.args = list(scientific = FALSE))
| Empresa | Trimestre | Ingresos |
|---|---|---|
| Empesa B | 1 | 118815.80 |
| Empesa B | 2 | 81849.51 |
| Empesa B | 3 | 82643.15 |
| Empesa B | 4 | 92439.95 |
| Empresa A | 1 | 39602.50 |
| Empresa A | 2 | 15923.16 |
| Empresa A | 3 | 24539.74 |
| Empresa A | 4 | 21610.99 |
| Empresa C | 1 | 49835.64 |
| Empresa C | 2 | 35070.19 |
| Empresa C | 3 | 31980.99 |
| Empresa C | 4 | 42715.54 |
temp<-group_by(df,Empresa,Moneda)
temp<-data.frame(summarise(temp, Ingresos =sum(IngresoPesos)))
knitr::kable(temp, format.args = list(scientific = FALSE))
| Empresa | Moneda | Ingresos |
|---|---|---|
| Empesa B | EURO | 3160.443 |
| Empesa B | PESO | 327243.321 |
| Empesa B | USD | 45344.650 |
| Empresa A | EURO | 1697.570 |
| Empresa A | PESO | 71668.070 |
| Empresa A | USD | 28310.747 |
| Empresa C | EURO | 1037.168 |
| Empresa C | PESO | 140589.724 |
| Empresa C | USD | 17975.466 |
data<-df
data$Mes<- format(as.Date(data$Fecha), "%Y-%m")
data<-select(data,Empresa,Moneda,Mes,IngresoPesos)
data<-group_by(data,Empresa,Moneda,Mes)
data<-data.frame(summarise(data, Ingresos =sum(IngresoPesos)))
p <- ggplot(data, aes(x=Mes, y=Ingresos,group=Moneda)) + geom_line(aes(color=Moneda))
p + facet_grid(rows = vars(Empresa))+ geom_smooth(method = "lm",se = FALSE,linetype = "dashed", size=0.2)
A partir del grafico anterior podemos concluir lo siguiente: